有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在不使用position的情况下打开不同的活动

这是一个包含类别和子类别的配方应用程序。我想知道除了position命令外,是否还有其他命令可以打开不同的活动。因为我在按字母顺序搜索时遇到了问题,所以当我单击项目时,它会给我不同的结果,因为位置正在改变。我不知道我的代码有什么问题,是搜索功能还是位置命令打开了不同的新活动

主适配器。班级

public class MainAdapter extends FirebaseRecyclerAdapter<MainModel,MainAdapter.myViewHolder> {

private Context context;

/**
 * Initialize a {@link RecyclerView.Adapter} that listens to a Firebase query. See
 * {@link FirebaseRecyclerOptions} for configuration options.
 *
 * @param options
 */
public MainAdapter(@NonNull FirebaseRecyclerOptions<MainModel> options) {
    super(options);
}

@Override
protected void onBindViewHolder(@NonNull MainAdapter.myViewHolder holder, int position, @NonNull MainModel model) {

    holder.categoryName.setText(model.getName());
    holder.categoryDesc.setText(model.getDescription());

    Glide.with(holder.categoryImage.getContext())
            .load(model.getImage())
            .placeholder(R.drawable.common_google_signin_btn_icon_dark)
            .error(R.drawable.common_google_signin_btn_icon_dark_normal)
            .into(holder.categoryImage);

    context = holder.itemView.getContext();

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final Intent intent;
            switch (position){
                case 0:
                    intent =  new Intent(context, ChickenActivity.class);
                    break;
                case 1:
                    intent =  new Intent(context, PorkActivity.class);
                    break;
                case 2:
                    intent =  new Intent(context, BeefActivity.class);
                    break;
                case 3:
                    intent =  new Intent(context, SeafoodActivity.class);
                    break;
                default:
                    intent =  new Intent(context, VegetableActivity.class);
                    break;
            }
            context.startActivity(intent);
        }

    });
}

@NonNull

@Override
public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_item,parent,false);
    return new myViewHolder(view);
}

class myViewHolder extends RecyclerView.ViewHolder{

    ImageView categoryImage;
    TextView categoryName, categoryDesc;


    public myViewHolder(@NonNull View itemView) {
        super(itemView);

        categoryImage = (ImageView)itemView.findViewById(R.id.categoryImage);
        categoryName = (TextView)itemView.findViewById(R.id.categoryName);
        categoryDesc = (TextView)itemView.findViewById(R.id.categoryDesc);


    }
}

}

主要活动。班级

public class MainActivity extends AppCompatActivity {

RecyclerView recyclerView;
MainAdapter mainAdapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    recyclerView = (RecyclerView)findViewById(R.id.recView);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    FirebaseRecyclerOptions<MainModel> options =
            new FirebaseRecyclerOptions.Builder<MainModel>()
                    .setQuery(FirebaseDatabase.getInstance().getReference().child("category"), MainModel.class)
                    .build();

    mainAdapter = new MainAdapter(options);
    recyclerView.setAdapter(mainAdapter);
}

@Override
protected void onStart() {
    super.onStart();
    mainAdapter.startListening();
}

@Override
protected void onStop() {
    super.onStop();
    mainAdapter.stopListening();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.search,menu);
    MenuItem item = menu.findItem(R.id.search);
    SearchView searchView = (SearchView)item.getActionView();

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            txtSearch(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String query) {
            txtSearch(query);
            return false;
        }
    });

    return super.onCreateOptionsMenu(menu);
}

private void txtSearch(String str)
{
    FirebaseRecyclerOptions<MainModel> options =
            new FirebaseRecyclerOptions.Builder<MainModel>()
                    .setQuery(FirebaseDatabase.getInstance().getReference().child("category").orderByChild("name").startAt(str).endAt(str+"~"), MainModel.class)
                    .build();

    mainAdapter = new MainAdapter(options);
    mainAdapter.startListening();
    recyclerView.setAdapter(mainAdapter);
}

}


共 (2) 个答案

  1. # 1 楼答案

    您可以使用“holder.getAdapterPosition”而不是“position”来解决这个问题

  2. # 2 楼答案

    不要将活动绑定到一个数字上,而应该将其绑定到一个标签或某个标识符上。例如,列表中有3项,如:

    [
      {
        name: "chickenwings"
      },
      {
        name: "octopus"
      },
      {
        name: "tomato"
      }
    ]
    

    相反,你可以有额外的信息,比如项目应该关联的活动

    [
      {
        name: "chickenwings",
        category: "chicken"
      },
      {
        name: "octopus",
        category: "seafood"
      },
      {
        name: "tomato",
        category: "vegetable"
      }
    ]
    

    这将帮助您更新代码,如下所示

    holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final Intent intent;
                val category = model.getCategory()
                switch (category){
                    case "chicken":
                        intent =  new Intent(context, ChickenActivity.class);
                        break;
                    case "pork":
                        intent =  new Intent(context, PorkActivity.class);
                        break;
                    case "beef":
                        intent =  new Intent(context, BeefActivity.class);
                        break;
                    case "seafood":
                        intent =  new Intent(context, SeafoodActivity.class);
                        break;
                    case "vegetable":
                    default:
                        intent =  new Intent(context, VegetableActivity.class);
                        break;
                }
                context.startActivity(intent);
            }
    
        });